package gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

@SuppressWarnings("serial")
public class BarraMenu extends JMenuBar {
	protected GameGUI gameGUI;

	protected JMenu mnJuego, mnHerramientas, mnAyuda;

	protected JMenuItem mntmVolverAlMenu, mntmRestart, mntmSalir;
	protected JMenuItem mntmTeclado, mntmGrillaOnoff, mntmFpsCounterOnoff;
	protected JMenuItem mntmHotkeys, mntmAbout;

	
	public BarraMenu(GameGUI gameGUI) {
		super();
		this.gameGUI = gameGUI;

		// Menu Juego
		mnJuego = new JMenu("Juego");
		mntmVolverAlMenu = new JMenuItem("Volver al Menu Principal");
		mntmRestart = new JMenuItem("Reiniciar Nivel");
		mntmSalir = new JMenuItem("Salir");

		// Menu Herramientas
		mnHerramientas = new JMenu("Herramientas");
		mntmTeclado = new JMenuItem("Teclado");
		mntmGrillaOnoff = new JMenuItem("Grilla ON/OFF");
		mntmFpsCounterOnoff = new JMenuItem("FPS Counter ON/OFF");

		// Menu Ayuda
		mnAyuda = new JMenu("Ayuda");
		mntmHotkeys = new JMenuItem("Controles");
		mntmAbout = new JMenuItem("Acerca de...");

		configure();
		addListeners();
	}

	/**
	 * Configura la barra agregando cada item a su correspondiente menu
	 */
	private void configure() {
		// Menu Juego
		this.add(mnJuego);
		mnJuego.add(mntmVolverAlMenu);
		mntmVolverAlMenu.setEnabled(false);
		mnJuego.add(mntmRestart);
		mntmRestart.setEnabled(false);
		mnJuego.add(mntmSalir);

		// Menu Herramientas
		this.add(mnHerramientas);
		mnHerramientas.add(mntmTeclado);
		mnHerramientas.add(mntmGrillaOnoff);
		mnHerramientas.add(mntmFpsCounterOnoff);

		// Menu Ayuda
		this.add(mnAyuda);
		mnAyuda.add(mntmHotkeys);
		mnAyuda.add(mntmAbout);
	}

	/**
	 * Agrega los listeners a todos los elementos del menu
	 */
	private void addListeners() {

		// Menu Juego
		mntmVolverAlMenu.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				gameGUI.terminarJuego();
			}
		});

		mntmRestart.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				gameGUI.reiniciarJuego();
			}
		});

		mntmSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		// Menu Herramientas
		mntmTeclado.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				gameGUI.mostrarTeclado();
			}
		});

		mntmGrillaOnoff.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				gameGUI.toogleGrid();
			}
		});

		mntmFpsCounterOnoff.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				gameGUI.toogleFPS();
			}
		});

		// Menu Ayuda
		mntmHotkeys.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null,
						" UpArrow: Avanzar \n RightArrow: Girar Derecha \n LeftArrow: Girar Izquierda \n Space: Disparar \n\n "
								+ "Shift: Agarrar Objeto \n Ctrl: Dejar Objeto \n\n "
								+ "Enter: Pincel ON/OFF \n 1: Color negro \n 0: Color blanco \n\n " + "G: Grid ON/OFF\n F: FPS Counter ON/OFF ",
						"Controles", JOptionPane.INFORMATION_MESSAGE);
			}
		});

		mntmAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, " Tecnologia de Programacion \n 2013 \n\n  Andres Frank \n  German Corpaz ", "Acerca de...",
						JOptionPane.INFORMATION_MESSAGE);
			}
		});
	}

	/**
	 * Cambia el estado (enabled/disabled) del item restart del menu
	 * @param b Estado
	 */
	public void toogleBotonRestart(boolean b) {
		mntmRestart.setEnabled(b);
	}
	
	/**
	 * Cambia el estado (enabled/disabled) del item volver del menu
	 * @param b Estado
	 */
	public void toogleBotonVolver(boolean b) {
		mntmVolverAlMenu.setEnabled(b);
	}
}
